package cn.wolfcode.luowowo.listener;

import cn.wolfcode.luowowo.cache.service.IStrategyStatisVORedisService;
import cn.wolfcode.luowowo.cache.vo.StrategyStatisVO;
import cn.wolfcode.luowowo.domain.Strategy;
import cn.wolfcode.luowowo.service.IStrategyService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 *  redis数据(初始化)监听器
 */
//@Component//交给spring管理
public class RedisDataInitListener implements ApplicationListener<ContextRefreshedEvent> {

    @Autowired
    private IStrategyService strategyService;
    @Autowired
    private IStrategyStatisVORedisService strategyStatisVORedisService;
    // 当容器触发调用refresh()方法时候马上执行下面逻辑
    // (也就说spring容器启动之后,并初始化完成以后马上执行下面逻辑)
    public void onApplicationEvent(ContextRefreshedEvent event) {
        System.out.println("-----------------初始化-vo--------------------");
        /**
         * 例如:第一次初始化时,攻略A 点赞数100  --->  vo中也是100
         *      一段时间过后,又有很多人点赞了, vo 点赞数200
         *      重启mgsite项目,再次执行初始化,最初攻略A点赞100会覆盖 redis中vo200的数据
         *      导致数据丢失.
         *      解决方案:如果redis中已经存在vo对象,直接跳过不初始化
         */
        // 1.查询(从Mongodb数据库)所有攻略
        List<Strategy> strategies = strategyService.listAll();
        // 2.将攻略对象转换成vo对象
        for (Strategy strategy : strategies) {

            // 判断指定的vo对象是否已经在redis中
            if(strategyStatisVORedisService.isStrategyVoExists(strategy.getId())){
                continue;//跳过
            }
            StrategyStatisVO vo = new StrategyStatisVO();
            // 3.把攻略里所对应vo中字段的数据复制到vo对象中
            BeanUtils.copyProperties(strategy,vo);
            vo.setStrategyId(strategy.getId());
            // 4.将vo对象缓存到redis中
            strategyStatisVORedisService.setStrategyStatisVo(vo);
        }
        System.out.println("-----------------初始化完成-vo--------------------");
    }
}
